{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "#注意事项:\n",
    "#当运行本Notebook的程序后，如果要关闭Notebook，请选择菜单: File > Close and Halt 才能确实停止当前正在运行的程序，并且释放资源\n",
"#如果没有使用以上方法，只关闭此分页，程序仍在运行，未释放资源，当您打开并运行其他的Notebook，可能会发生错误"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "u'spark://master:7077'"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sc.master"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 13.6\t如何进行数据准备?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "global Path    \n",
    "if sc.master[0:5]==\"local\" :\n",
    "   Path=\"file:/home/hduser/pythonsparkexample/PythonProject/\"\n",
    "else:   \n",
    "   Path=\"hdfs://master:9000/user/hduser/\"\n",
    "#如果要在cluster模式运行(hadoop yarn 或Spark Stand alone)，请按照书上的说明，先把文件上传到HDFS目录"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "开始导入数据...\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "[u'\"url\"\\t\"urlid\"\\t\"boilerplate\"\\t\"alchemy_category\"\\t\"alchemy_category_score\"\\t\"avglinksize\"\\t\"commonlinkratio_1\"\\t\"commonlinkratio_2\"\\t\"commonlinkratio_3\"\\t\"commonlinkratio_4\"\\t\"compression_ratio\"\\t\"embed_ratio\"\\t\"framebased\"\\t\"frameTagRatio\"\\t\"hasDomainLink\"\\t\"html_ratio\"\\t\"image_ratio\"\\t\"is_news\"\\t\"lengthyLinkDomain\"\\t\"linkwordscore\"\\t\"news_front_page\"\\t\"non_markup_alphanum_characters\"\\t\"numberOfLinks\"\\t\"numwords_in_url\"\\t\"parametrizedLinkRatio\"\\t\"spelling_errors_ratio\"\\t\"label\"',\n",
       " u'\"http://www.bloomberg.com/news/2010-12-23/ibm-predicts-holographic-calls-air-breathing-batteries-by-2015.html\"\\t\"4042\"\\t\"{\"\"title\"\":\"\"IBM Sees Holographic Calls Air Breathing Batteries ibm sees holographic calls, air-breathing batteries\"\",\"\"body\"\":\"\"A sign stands outside the International Business Machines Corp IBM Almaden Research Center campus in San Jose California Photographer Tony Avelar Bloomberg Buildings stand at the International Business Machines Corp IBM Almaden Research Center campus in the Santa Teresa Hills of San Jose California Photographer Tony Avelar Bloomberg By 2015 your mobile phone will project a 3 D image of anyone who calls and your laptop will be powered by kinetic energy At least that s what International Business Machines Corp sees in its crystal ball The predictions are part of an annual tradition for the Armonk New York based company which surveys its 3 000 researchers to find five ideas expected to take root in the next five years IBM the world s largest provider of computer services looks to Silicon Valley for input gleaning many ideas from its Almaden research center in San Jose California Holographic conversations projected from mobile phones lead this year s list The predictions also include air breathing batteries computer programs that can tell when and where traffic jams will take place environmental information generated by sensors in cars and phones and cities powered by the heat thrown off by computer servers These are all stretch goals and that s good said Paul Saffo managing director of foresight at the investment advisory firm Discern in San Francisco In an era when pessimism is the new black a little dose of technological optimism is not a bad thing For IBM it s not just idle speculation The company is one of the few big corporations investing in long range research projects and it counts on innovation to fuel growth Saffo said Not all of its predictions pan out though IBM was overly optimistic about the spread of speech technology for instance When the ideas do lead to products they can have broad implications for society as well as IBM s bottom line he said Research Spending They have continued to do research when all the other grand research organizations are gone said Saffo who is also a consulting associate professor at Stanford University IBM invested 5 8 billion in research and development last year 6 1 percent of revenue While that s down from about 10 percent in the early 1990s the company spends a bigger share on research than its computing rivals Hewlett Packard Co the top maker of personal computers spent 2 4 percent last year At Almaden scientists work on projects that don t always fit in with IBM s computer business The lab s research includes efforts to develop an electric car battery that runs 500 miles on one charge a filtration system for desalination and a program that shows changes in geographic data IBM rose 9 cents to 146 04 at 11 02 a m in New York Stock Exchange composite trading The stock had gained 11 percent this year before today Citizen Science The list is meant to give a window into the company s innovation engine said Josephine Cheng a vice president at IBM s Almaden lab All this demonstrates a real culture of innovation at IBM and willingness to devote itself to solving some of the world s biggest problems she said Many of the predictions are based on projects that IBM has in the works One of this year s ideas that sensors in cars wallets and personal devices will give scientists better data about the environment is an expansion of the company s citizen science initiative Earlier this year IBM teamed up with the California State Water Resources Control Board and the City of San Jose Environmental Services to help gather information about waterways Researchers from Almaden created an application that lets smartphone users snap photos of streams and creeks and report back on conditions The hope is that these casual observations will help local and state officials who don t have the resources to do the work themselves Traffic Predictors IBM also sees data helping shorten commutes in the next five years Computer programs will use algorithms and real time traffic information to predict which roads will have backups and how to avoid getting stuck Batteries may last 10 times longer in 2015 than today IBM says Rather than using the current lithium ion technology new models could rely on energy dense metals that only need to interact with the air to recharge Some electronic devices might ditch batteries altogether and use something similar to kinetic wristwatches which only need to be shaken to generate a charge The final prediction involves recycling the heat generated by computers and data centers Almost half of the power used by data centers is currently spent keeping the computers cool IBM scientists say it would be better to harness that heat to warm houses and offices In IBM s first list of predictions compiled at the end of 2006 researchers said instantaneous speech translation would become the norm That hasn t happened yet While some programs can quickly translate electronic documents and instant messages and other apps can perform limited speech translation there s nothing widely available that acts like the universal translator in Star Trek Second Life The company also predicted that online immersive environments such as Second Life would become more widespread While immersive video games are as popular as ever Second Life s growth has slowed Internet users are flocking instead to the more 2 D environments of Facebook Inc and Twitter Inc Meanwhile a 2007 prediction that mobile phones will act as a wallet ticket broker concierge bank and shopping assistant is coming true thanks to the explosion of smartphone applications Consumers can pay bills through their banking apps buy movie tickets and get instant feedback on potential purchases all with a few taps on their phones The nice thing about the list is that it provokes thought Saffo said If everything came true they wouldn t be doing their job To contact the reporter on this story Ryan Flinn in San Francisco at rflinn bloomberg net To contact the editor responsible for this story Tom Giles at tgiles5 bloomberg net by 2015, your mobile phone will project a 3-d image of anyone who calls and your laptop will be powered by kinetic energy. at least that\\\\u2019s what international business machines corp. sees in its crystal ball.\"\",\"\"url\"\":\"\"bloomberg news 2010 12 23 ibm predicts holographic calls air breathing batteries by 2015 html\"\"}\"\\t\"business\"\\t\"0.789131\"\\t\"2.055555556\"\\t\"0.676470588\"\\t\"0.205882353\"\\t\"0.047058824\"\\t\"0.023529412\"\\t\"0.443783175\"\\t\"0\"\\t\"0\"\\t\"0.09077381\"\\t\"0\"\\t\"0.245831182\"\\t\"0.003883495\"\\t\"1\"\\t\"1\"\\t\"24\"\\t\"0\"\\t\"5424\"\\t\"170\"\\t\"8\"\\t\"0.152941176\"\\t\"0.079129575\"\\t\"0\"']"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "print(\"开始导入数据...\")\n",
    "rawDataWithHeader = sc.textFile(Path+\"data/train.tsv\")\n",
    "rawDataWithHeader.take(2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "开始导入数据...\n",
      "共计：7395项\n"
     ]
    }
   ],
   "source": [
    "print(\"开始导入数据...\")\n",
    "rawDataWithHeader = sc.textFile(Path+\"data/train.tsv\")\n",
    "header = rawDataWithHeader.first() \n",
    "rawData = rawDataWithHeader.filter(lambda x:x !=header)    \n",
    "rData=rawData.map(lambda x: x.replace(\"\\\"\", \"\"))    \n",
    "lines = rData.map(lambda x: x.split(\"\\t\"))\n",
    "print(\"共计：\" + str(lines.count()) + \"项\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": false,
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[u'business',\n",
       " u'0.789131',\n",
       " u'2.055555556',\n",
       " u'0.676470588',\n",
       " u'0.205882353',\n",
       " u'0.047058824',\n",
       " u'0.023529412',\n",
       " u'0.443783175',\n",
       " u'0',\n",
       " u'0',\n",
       " u'0.09077381',\n",
       " u'0',\n",
       " u'0.245831182',\n",
       " u'0.003883495',\n",
       " u'1',\n",
       " u'1',\n",
       " u'24',\n",
       " u'0',\n",
       " u'5424',\n",
       " u'170',\n",
       " u'8',\n",
       " u'0.152941176',\n",
       " u'0.079129575',\n",
       " u'0']"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "lines.first()[3:]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "categoriesMap =lines.map(lambda fields: fields[3]) \\\n",
    "        .distinct().zipWithIndex().collectAsMap()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{u'?': 6,\n",
       " u'arts_entertainment': 13,\n",
       " u'business': 1,\n",
       " u'computer_internet': 2,\n",
       " u'culture_politics': 3,\n",
       " u'gaming': 7,\n",
       " u'health': 5,\n",
       " u'law_crime': 4,\n",
       " u'recreation': 0,\n",
       " u'religion': 11,\n",
       " u'science_technology': 9,\n",
       " u'sports': 10,\n",
       " u'unknown': 8,\n",
       " u'weather': 12}"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "categoriesMap"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "14"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(categoriesMap)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "dict"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "type(categoriesMap)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "def extract_features(field,categoriesMap,featureEnd):\n",
    "    #提取分类特征字段\n",
    "    categoryIdx = categoriesMap[field[3]] \n",
    "    categoryFeatures = np.zeros(len(categoriesMap))\n",
    "    categoryFeatures[categoryIdx] = 1\n",
    "    #提取数值字段\n",
    "    numericalFeatures=[convert_float(field)  for  field in field[4: featureEnd]]    \n",
    "    #返回“分类特征字段”+“数值特征字段”\n",
    "    return  np.concatenate(( categoryFeatures, numericalFeatures))\n",
    "\n",
    "def convert_float(x):\n",
    "    return (0 if x==\"?\" else float(x))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def extract_label(field):\n",
    "    label=(field[-1])\n",
    "    return float(label)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[0.0]\n"
     ]
    }
   ],
   "source": [
    "labelRDD = lines.map( lambda r: extract_label(r))\n",
    "print labelRDD.take(1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "from pyspark.mllib.regression import LabeledPoint\n",
    "labelpointRDD = lines.map( lambda r: \n",
    "     LabeledPoint(\n",
    "                extract_label(r),\n",
    "                extract_features(r,categoriesMap,len(r) - 1)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[u'business', u'0.789131', u'2.055555556', u'0.676470588', u'0.205882353', u'0.047058824', u'0.023529412', u'0.443783175', u'0', u'0', u'0.09077381', u'0', u'0.245831182', u'0.003883495', u'1', u'1', u'24', u'0', u'5424', u'170', u'8', u'0.152941176', u'0.079129575', u'0']\n"
     ]
    }
   ],
   "source": [
    "print lines.first()[3:]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[LabeledPoint(0.0, [0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.789131,2.055555556,0.676470588,0.205882353,0.047058824,0.023529412,0.443783175,0.0,0.0,0.09077381,0.0,0.245831182,0.003883495,1.0,1.0,24.0,0.0,5424.0,170.0,8.0,0.152941176,0.079129575])]"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "labelpointRDD.take(1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "将数据分trainData:5917   validationData:743   testData:735\n"
     ]
    }
   ],
   "source": [
    "(trainData, validationData, testData) = labelpointRDD.randomSplit([8, 1, 1])\n",
    "print(\"将数据分trainData:\" + str(trainData.count()) +   \n",
    "          \"   validationData:\" + str(validationData.count()) + \n",
    "          \"   testData:\" + str(testData.count()))\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "def PrepareData(sc): \n",
    "    #----------------------1.导入并转换数据-------------\n",
    "    global Path    \n",
    "    if sc.master[0:5]==\"local\" :\n",
    "       Path=\"file:/home/hduser/pythonsparkexample/PythonProject/\"\n",
    "    else:   \n",
    "       Path=\"hdfs://master:9000/user/hduser/\"\n",
    "\n",
    "    print(\"开始导入数据...\")\n",
    "    rawDataWithHeader = sc.textFile(Path+\"data/train.tsv\")\n",
    "    header = rawDataWithHeader.first() \n",
    "    rawData = rawDataWithHeader.filter(lambda x:x !=header)    \n",
    "    rData=rawData.map(lambda x: x.replace(\"\\\"\", \"\"))    \n",
    "    lines = rData.map(lambda x: x.split(\"\\t\"))\n",
    "    print(\"共计：\" + str(lines.count()) + \"项\")\n",
    "    #----------2.建立训练评估所需数据 RDD[LabeledPoint]-------    \n",
    "    categoriesMap = lines.map(lambda fields: fields[3]).\\\n",
    "                                   distinct().zipWithIndex().collectAsMap()\n",
    "    labelpointRDD = lines.map( lambda r:\n",
    "               LabeledPoint(\n",
    "                      extract_label(r), \n",
    "                      extract_features(r,categoriesMap,-1)))\n",
    "    \n",
    "    labelpointRDDFeaturesInfo = lines.map( lambda r:LabeledPoint(\n",
    "                 extract_label(r), \n",
    "                 extract_features_FeaturesInfo(r,categoriesMap,len(r) - 1)))\n",
    "        \n",
    "    #-----------3.以随机方式将数据分为3个部分并且返回-------------\n",
    "    (trainData, validationData, testData) = labelpointRDD.randomSplit([8, 1, 1])\n",
    "    print(\"将数据分trainData:\" + str(trainData.count()) + \n",
    "              \"   validationData:\" + str(validationData.count()) +\n",
    "              \"   testData:\" + str(testData.count()))\n",
    "    return (trainData, validationData, testData, categoriesMap) #返回数据\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "开始导入数据...\n",
      "共计：7395项\n",
      "将数据分trainData:5897   validationData:736   testData:762\n"
     ]
    }
   ],
   "source": [
    "(trainData, validationData, testData, categoriesMap) =PrepareData(sc)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "PythonRDD[35] at RDD at PythonRDD.scala:48"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "trainData.persist()\n",
    "validationData.persist()\n",
    "testData.persist()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 13.7\t如何训练模型?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "from pyspark.mllib.tree import DecisionTree\n",
    "model=DecisionTree.trainClassifier( \\\n",
    "        trainData, numClasses=2, categoricalFeaturesInfo={}, \\\n",
    "        impurity=\"entropy\", maxDepth=5, maxBins=5)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 13.8\t如何使用模型进行预测?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "def PredictData(sc,model,categoriesMap): \n",
    "    print(\"开始导入数据...\")\n",
    "    rawDataWithHeader = sc.textFile(Path+\"data/test.tsv\")\n",
    "    header = rawDataWithHeader.first() \n",
    "    rawData = rawDataWithHeader.filter(lambda x:x !=header)    \n",
    "    rData=rawData.map(lambda x: x.replace(\"\\\"\", \"\"))    \n",
    "    lines = rData.map(lambda x: x.split(\"\\t\"))\n",
    "    print(\"共计：\" + str(lines.count()) + \"项\")\n",
    "    dataRDD = lines.map(lambda r:  ( r[0]  ,\n",
    "                            extract_features(r,categoriesMap,len(r) )))\n",
    "    DescDict = {\n",
    "           0: \"暂时性网页(ephemeral)\",\n",
    "           1: \"长青网页(evergreen)\"\n",
    "     }\n",
    "    for data in dataRDD.take(10):\n",
    "        predictResult = model.predict(data[1])\n",
    "        print \" 网址：  \" +str(data[0])+\"\\n\" +\\\n",
    "                  \"             ==>预测:\"+ str(predictResult)+ \\\n",
    "                  \" 说明:\"+DescDict[predictResult] +\"\\n\"\n",
    "    "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "==========预测数据===============\n",
      "开始导入数据...\n",
      "共计：3171项\n",
      " 网址：  http://www.lynnskitchenadventures.com/2009/04/homemade-enchilada-sauce.html\n",
      "             ==>预测:1.0 说明:长青网页(evergreen)\n",
      "\n",
      " 网址：  http://lolpics.se/18552-stun-grenade-ar\n",
      "             ==>预测:0.0 说明:暂时性网页(ephemeral)\n",
      "\n",
      " 网址：  http://www.xcelerationfitness.com/treadmills.html\n",
      "             ==>预测:0.0 说明:暂时性网页(ephemeral)\n",
      "\n",
      " 网址：  http://www.bloomberg.com/news/2012-02-06/syria-s-assad-deploys-tactics-of-father-to-crush-revolt-threatening-reign.html\n",
      "             ==>预测:0.0 说明:暂时性网页(ephemeral)\n",
      "\n",
      " 网址：  http://www.wired.com/gadgetlab/2011/12/stem-turns-lemons-and-limes-into-juicy-atomizers/\n",
      "             ==>预测:0.0 说明:暂时性网页(ephemeral)\n",
      "\n",
      " 网址：  http://www.latimes.com/health/boostershots/la-heb-fat-tax-denmark-20111013,0,2603132.story\n",
      "             ==>预测:0.0 说明:暂时性网页(ephemeral)\n",
      "\n",
      " 网址：  http://www.howlifeworks.com/a/a?AG_ID=1186&cid=7340ci\n",
      "             ==>预测:1.0 说明:长青网页(evergreen)\n",
      "\n",
      " 网址：  http://romancingthestoveblog.wordpress.com/2010/01/13/sweet-potato-ravioli-with-lemon-sage-brown-butter-sauce/\n",
      "             ==>预测:1.0 说明:长青网页(evergreen)\n",
      "\n",
      " 网址：  http://www.funniez.net/Funny-Pictures/turn-men-down.html\n",
      "             ==>预测:0.0 说明:暂时性网页(ephemeral)\n",
      "\n",
      " 网址：  http://youfellasleepwatchingadvd.com/\n",
      "             ==>预测:0.0 说明:暂时性网页(ephemeral)\n",
      "\n"
     ]
    }
   ],
   "source": [
    "print(\"==========预测数据===============\")\n",
    "PredictData(sc, model, categoriesMap)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 13.9\t如何评估模型的准确率?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[(0.0, 0.0), (0.0, 0.0), (0.0, 0.0), (0.0, 1.0), (0.0, 1.0)]"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "score = model.predict(validationData.map(lambda p: p.features))\n",
    "scoreAndLabels=score .zip(validationData.map(lambda p: p.label))\n",
    "scoreAndLabels.take(5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {
    "collapsed": false,
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "AUC=0.647716193459\n"
     ]
    }
   ],
   "source": [
    "from pyspark.mllib.evaluation import BinaryClassificationMetrics\n",
    "metrics = BinaryClassificationMetrics(scoreAndLabels)\n",
    "print \"AUC=\"+str(metrics.areaUnderROC)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def evaluateModel(model, validationData):\n",
    "    score = model.predict(validationData.map(lambda p: p.features))\n",
    "    scoreAndLabels=score.zip(validationData.map(lambda p: p.label))\n",
    "    metrics = BinaryClassificationMetrics(scoreAndLabels)\n",
    "    AUC=metrics.areaUnderROC\n",
    "    return( AUC)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "AUC=0.647716193459\n"
     ]
    }
   ],
   "source": [
    "AUC=evaluateModel(model, validationData)\n",
    "print \"AUC=\"+str(AUC)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "from time import time\n",
    "def trainEvaluateModel(trainData,validationData,\n",
    "                                        impurityParm, maxDepthParm, maxBinsParm):\n",
    "    startTime = time()\n",
    "    model = DecisionTree.trainClassifier(trainData,\n",
    "                numClasses=2, categoricalFeaturesInfo={}, impurity=impurityParm,\n",
    "                maxDepth=maxDepthParm, maxBins=maxBinsParm)\n",
    "    AUC = evaluateModel(model, validationData)\n",
    "    duration = time() - startTime\n",
    "    print    \"训练评估：使用参数\" + \\\n",
    "                \" impurity=\"+str(impurityParm) +\\\n",
    "                \" maxDepth=\"+str(maxDepthParm) + \\\n",
    "                \" maxBins=\"+str(maxBinsParm) +\"\\n\" +\\\n",
    "                 \" ==>所需时间=\"+str(duration) + \\\n",
    "                 \" 结果AUC = \" + str(AUC) \n",
    "    return (AUC,duration, impurityParm, maxDepthParm, maxBinsParm,model)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "训练评估：使用参数 impurity=entropy maxDepth=5 maxBins=5\n",
      " ==>所需时间=3.03691887856 结果AUC = 0.647716193459\n"
     ]
    }
   ],
   "source": [
    "(AUC,duration, impurityParm, maxDepthParm, maxBinsParm,model)=  \\\n",
    "       trainEvaluateModel(trainData, validationData, \"entropy\", 5, 5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "训练评估：使用参数 impurity=entropy maxDepth=5 maxBins=5\n",
      " ==>所需时间=4.73913788795 结果AUC = 0.670959944751\n"
     ]
    }
   ],
   "source": [
    "(AUC,duration, impurityParm, maxDepthParm, maxBinsParm,model)=  \\\n",
    "       trainEvaluateModel(trainData, testData, \"entropy\", 5, 5)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 13.10\t模型的训练参数如何影响准确率?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "训练评估：使用参数 impurity=gini maxDepth=10 maxBins=10\n",
      " ==>所需时间=3.92659020424 结果AUC = 0.64945194552\n",
      "训练评估：使用参数 impurity=entropy maxDepth=10 maxBins=10\n",
      " ==>所需时间=2.7336370945 结果AUC = 0.651017815464\n"
     ]
    }
   ],
   "source": [
    "impurityList=[\"gini\", \"entropy\"]\n",
    "maxDepthList  =[10]\n",
    "maxBinsList=[10 ]\n",
    "\n",
    "metrics = [trainEvaluateModel(trainData, validationData,  \n",
    "                              impurity,maxDepth,  maxBins  ) \n",
    "                 for impurity in impurityList \n",
    "                 for maxDepth in maxDepthList  \n",
    "                 for maxBins in maxBinsList ]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[(0.6494519455195438,\n",
       "  3.9265902042388916,\n",
       "  'gini',\n",
       "  10,\n",
       "  10,\n",
       "  DecisionTreeModel classifier of depth 10 with 667 nodes),\n",
       " (0.6510178154637043,\n",
       "  2.7336370944976807,\n",
       "  'entropy',\n",
       "  10,\n",
       "  10,\n",
       "  DecisionTreeModel classifier of depth 10 with 617 nodes)]"
      ]
     },
     "execution_count": 32,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "metrics"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>AUC</th>\n",
       "      <th>duration</th>\n",
       "      <th>impurity</th>\n",
       "      <th>maxDepth</th>\n",
       "      <th>maxBins</th>\n",
       "      <th>model</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>gini</th>\n",
       "      <td>0.649452</td>\n",
       "      <td>3.926590</td>\n",
       "      <td>gini</td>\n",
       "      <td>10</td>\n",
       "      <td>10</td>\n",
       "      <td>DecisionTreeModel classifier of depth 10 with ...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>entropy</th>\n",
       "      <td>0.651018</td>\n",
       "      <td>2.733637</td>\n",
       "      <td>entropy</td>\n",
       "      <td>10</td>\n",
       "      <td>10</td>\n",
       "      <td>DecisionTreeModel classifier of depth 10 with ...</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "              AUC  duration impurity  maxDepth  maxBins  \\\n",
       "gini     0.649452  3.926590     gini        10       10   \n",
       "entropy  0.651018  2.733637  entropy        10       10   \n",
       "\n",
       "                                                     model  \n",
       "gini     DecisionTreeModel classifier of depth 10 with ...  \n",
       "entropy  DecisionTreeModel classifier of depth 10 with ...  "
      ]
     },
     "execution_count": 33,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import pandas as pd\n",
    "IndexList=impurityList\n",
    "df = pd.DataFrame(metrics,index=IndexList,\n",
    "            columns=['AUC', 'duration','impurity', 'maxDepth', 'maxBins','model'])\n",
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\nAElFTkSuQmCC\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7ffbb08f3190>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline \n",
    "evalparm='impurity'\n",
    "ax = df['AUC'].plot(kind='bar', title =evalparm,figsize=(10,6),\n",
    "                legend=True, fontsize=12)\n",
    "ax.set_xlabel(evalparm,fontsize=12)\n",
    "ax.set_ylim([0.55,0.7])\n",
    "ax.set_ylabel(\"AUC\",fontsize=12)\n",
    "ax2 = ax.twinx()\n",
    "ax2.plot(df['duration'].values, linestyle='-', marker='o', linewidth=2.0,color='r')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "def showchart(df,evalparm ,barData,lineData,yMin,yMax):\n",
    "    ax = df[barData].plot(kind='bar', title =evalparm,\n",
    "                                         figsize=(10,6),legend=True, fontsize=12)\n",
    "    ax.set_xlabel(evalparm,fontsize=12)\n",
    "    ax.set_ylim([yMin,yMax])\n",
    "    ax.set_ylabel(barData,fontsize=12)\n",
    "    ax2 = ax.twinx()\n",
    "    ax2.plot(df[lineData ].values, linestyle='-', marker='o',\n",
    "                    linewidth=2.0,color='r')\n",
    "    plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\nRK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7ffbb7736bd0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "showchart(df,'impurity','AUC','duration',0.5,0.7 )"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "#定义evalParameter函数\n",
    "def evalParameter(trainData, validationData, evalparm,\n",
    "                  impurityList, maxDepthList, maxBinsList):\n",
    "    #训练评估参数\n",
    "    metrics = [trainEvaluateModel(trainData, validationData,  \n",
    "                                impurity,maxDepth,  maxBins  ) \n",
    "                       for impurity in impurityList\n",
    "                       for maxDepth in maxDepthList  \n",
    "                       for maxBins in maxBinsList ]\n",
    "    #设置当前评估的参数\n",
    "    if evalparm==\"impurity\":\n",
    "        IndexList=impurityList[:]\n",
    "    elif evalparm==\"maxDepth\":\n",
    "        IndexList=maxDepthList[:]\n",
    "    elif evalparm==\"maxBins\":\n",
    "        IndexList=maxBinsList[:]\n",
    "    #转换为Pandas DataFrame\n",
    "    df = pd.DataFrame(metrics,index=IndexList,\n",
    "            columns=['AUC', 'duration','impurity', 'maxDepth', 'maxBins','model'])\n",
    "    #显示图形\n",
    "    showchart(df,evalparm,'AUC','duration',0.5,0.7 )\n",
    "    "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "训练评估：使用参数 impurity=gini maxDepth=10 maxBins=10\n",
      " ==>所需时间=2.89534091949 结果AUC = 0.64945194552\n",
      "训练评估：使用参数 impurity=entropy maxDepth=10 maxBins=10\n",
      " ==>所需时间=2.75364089012 结果AUC = 0.651017815464\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7ffbade42a50>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "evalParameter(trainData, validationData,\"impurity\", \n",
    "                              impurityList=[\"gini\", \"entropy\"],   \n",
    "                              maxDepthList=[10],  \n",
    "                              maxBinsList=[10 ])  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {
    "collapsed": false,
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "训练评估：使用参数 impurity=gini maxDepth=3 maxBins=10\n",
      " ==>所需时间=1.62775993347 结果AUC = 0.619360652347\n",
      "训练评估：使用参数 impurity=gini maxDepth=5 maxBins=10\n",
      " ==>所需时间=1.77454900742 结果AUC = 0.632146128165\n",
      "训练评估：使用参数 impurity=gini maxDepth=10 maxBins=10\n",
      " ==>所需时间=2.25420403481 结果AUC = 0.64945194552\n",
      "训练评估：使用参数 impurity=gini maxDepth=15 maxBins=10\n",
      " ==>所需时间=3.18579912186 结果AUC = 0.621199810914\n",
      "训练评估：使用参数 impurity=gini maxDepth=20 maxBins=10\n",
      " ==>所需时间=3.56553721428 结果AUC = 0.617233432801\n",
      "训练评估：使用参数 impurity=gini maxDepth=25 maxBins=10\n",
      " ==>所需时间=4.13618803024 结果AUC = 0.61433805064\n"
     ]
    },
    {
     "data": {
      "image/png": "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\nCCy8Jk+kAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7ffbadcbce10>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "evalParameter(trainData, validationData,\"maxDepth\", \n",
    "                          impurityList=[\"gini\"],                    \n",
    "                          maxDepthList=[3, 5, 10, 15, 20, 25],    \n",
    "                          maxBinsList=[10])   "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "训练评估：使用参数 impurity=gini maxDepth=10 maxBins=3\n",
      " ==>所需时间=2.0863161087 结果AUC = 0.6194123556\n",
      "训练评估：使用参数 impurity=gini maxDepth=10 maxBins=5\n",
      " ==>所需时间=2.13967013359 结果AUC = 0.619057819009\n",
      "训练评估：使用参数 impurity=gini maxDepth=10 maxBins=10\n",
      " ==>所需时间=2.27937817574 结果AUC = 0.64945194552\n",
      "训练评估：使用参数 impurity=gini maxDepth=10 maxBins=50\n",
      " ==>所需时间=4.25811600685 结果AUC = 0.617632286466\n",
      "训练评估：使用参数 impurity=gini maxDepth=10 maxBins=100\n",
      " ==>所需时间=4.01602387428 结果AUC = 0.632781339557\n",
      "训练评估：使用参数 impurity=gini maxDepth=10 maxBins=200\n",
      " ==>所需时间=2.74720883369 结果AUC = 0.652975152894\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n9ttv0759+x0FYCZRd7CIiIhktQkTJrBgwQLOPvtsevfuTdeuXXnqqacq9bOrVq2idevWKY4wNVQE\nioiISFYbOXIkxx9/PM2bNwdg0KBBPP744wDUqVNnp4kiAHl5eeTk5ACw6667snTp0vQGnCTqDhYR\nEZGstXnzZp577jny8/N3tOht2bKFtWvXMnXqVDp06FBij99vv/2Wjh07AtC3b18uu+wyJk6cSO/e\nvdMdfo2oJVBERESy1gsvvECdOnWYOXMmU6ZMYcqUKXz11VccddRRjBw5koEDBzJ8+HA+++wzAGbN\nmsW99967Y+JH165d+c1vfsOgQYN47733yMvLY8uWLTz77LP85S9/CfmrVcjivqGzmbm4/44iIiJR\nZmYU/7fYL7GSyn+fS75mafr168d+++1XomB7/vnnGTp0KIsWLWLkyJHcddddLFq0iN13352LL76Y\na6+9dqfrH3jgAf7xj38wb948mjdvzpFHHsktt9zCPvvsU3p0pfw3KfJ81aY2V5OKQBEREUmp0gqe\n3NxOiWViUqNVq44sWzYvZfevKRWBaaAiUEREJKyyCp5sFoUiUGMCRURERLKQikARERGRLKQiUERE\nRCQLqQgUERERyUIqAkVERESykIpAERERkSykbeNEREQkpTp27JhYHFoKFGw7F5LWCRQRyVLz585l\nxM03k794MbXatuWiO+6gY+fOocMSyWpaLDqJVASKiJQ0f+5cHvjJT7jt229pCGwEhnXpwuXjxqkQ\nFAlIi0WLiEhKjbj55h0FIEBD4LY5cxjxf/8HeXkhQxORNFERKCKShfIXLdpRABZoCOS/8w7svjtc\ncAG8+CJs2hQiPBFJAxWBIiJZqJYZG4s9txGo1bQprFkDTzwBp58OLVvCmWfCU0/B2rUhQhWRFFER\nKCKShS6qX59hsKMQLBgTeNGkSfD113DnnXDwwb4l8L//hXPP9QVhv37wr3/BihUBoxeRZNDEEBGR\nbPPdd9CmDfPz8hhx2mnkr11LrTZtSp8dvHCh7xYePRrefx/y8/3ztWrBkUfCgAG+xbBDh/T/HiIx\npNnBSaQiUESkmPvvh6FD4cQT4bXXKv9zK1fCyy/7gnDcONi6tfDcgQf6gnDAANh77+THLJIlVAQm\nkYpAEZEinINevWDqVHjuOTjrrOrdZ906GDvWF4Rjx8LGIiMM9967sCDs3Ru0SLBIpakITCIVgSIi\n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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7ffbadd0bad0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "evalParameter(trainData, validationData,\"maxBins\", \n",
    "                          impurityList=[\"gini\"],      \n",
    "                          maxDepthList =[10],        \n",
    "                          maxBinsList=[3, 5, 10, 50, 100, 200 ])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 13.11\t如何找出准确率最高的参数组合?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "#定义evalAllParameter函数\n",
    "def evalAllParameter(trainData, validationData, \n",
    "                     impurityList, maxDepthList, maxBinsList):    \n",
    "    #for循环训练评估所有参数组合\n",
    "    metrics = [trainEvaluateModel(trainData, validationData,  \n",
    "                            impurity,maxDepth,  maxBins  ) \n",
    "                      for impurity in impurityList \n",
    "                      for maxDepth in maxDepthList  \n",
    "                      for  maxBins in maxBinsList ]\n",
    "    #找出AUC最大的参数组合\n",
    "    Smetrics = sorted(metrics, key=lambda k: k[0], reverse=True)\n",
    "    bestParameter=Smetrics[0]\n",
    "    #显示调校后最佳参数组合      \n",
    "    print(\"调校后最佳参数：impurity:\" + str(bestParameter[2]) + \n",
    "                                      \",maxDepth:\" + str(bestParameter[3]) + \n",
    "                                     \",maxBins:\" + str(bestParameter[4])   + \n",
    "                                      \"\\n,    结果AUC = \" + str(bestParameter[0]))\n",
    "    #返回最佳模型\n",
    "    return bestParameter[5]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "-----所有参数训练评估找出最好的参数组合---------\n",
      "训练评估：使用参数 impurity=gini maxDepth=3 maxBins=3\n",
      " ==>所需时间=1.40247583389 结果AUC = 0.610364286347\n",
      "训练评估：使用参数 impurity=gini maxDepth=3 maxBins=5\n",
      " ==>所需时间=1.20420908928 结果AUC = 0.599344107306\n",
      "训练评估：使用参数 impurity=gini maxDepth=3 maxBins=10\n",
      " ==>所需时间=1.19195795059 结果AUC = 0.619360652347\n",
      "训练评估：使用参数 impurity=gini maxDepth=3 maxBins=50\n",
      " ==>所需时间=1.33700799942 结果AUC = 0.620697550743\n",
      "训练评估：使用参数 impurity=gini maxDepth=3 maxBins=100\n",
      " ==>所需时间=1.1923968792 结果AUC = 0.618112388099\n",
      "训练评估：使用参数 impurity=gini maxDepth=3 maxBins=200\n",
      " ==>所需时间=1.2945971489 结果AUC = 0.619582237717\n",
      "训练评估：使用参数 impurity=gini maxDepth=5 maxBins=3\n",
      " ==>所需时间=1.37299108505 结果AUC = 0.610445534316\n",
      "训练评估：使用参数 impurity=gini maxDepth=5 maxBins=5\n",
      " ==>所需时间=1.51850700378 结果AUC = 0.646334977989\n",
      "训练评估：使用参数 impurity=gini maxDepth=5 maxBins=10\n",
      " ==>所需时间=1.38351011276 结果AUC = 0.632146128165\n",
      "训练评估：使用参数 impurity=gini maxDepth=5 maxBins=50\n",
      " ==>所需时间=1.31359910965 结果AUC = 0.626488315065\n",
      "训练评估：使用参数 impurity=gini maxDepth=5 maxBins=100\n",
      " ==>所需时间=1.5280380249 结果AUC = 0.625328684965\n",
      "训练评估：使用参数 impurity=gini maxDepth=5 maxBins=200\n",
      " ==>所需时间=1.38889098167 结果AUC = 0.625594587408\n",
      "训练评估：使用参数 impurity=gini maxDepth=10 maxBins=3\n",
      " ==>所需时间=1.85613584518 结果AUC = 0.6194123556\n",
      "训练评估：使用参数 impurity=gini maxDepth=10 maxBins=5\n",
      " ==>所需时间=1.98305416107 结果AUC = 0.619057819009\n",
      "训练评估：使用参数 impurity=gini maxDepth=10 maxBins=10\n",
      " ==>所需时间=1.92641711235 结果AUC = 0.64945194552\n",
      "训练评估：使用参数 impurity=gini maxDepth=10 maxBins=50\n",
      " ==>所需时间=1.77045488358 结果AUC = 0.617632286466\n",
      "训练评估：使用参数 impurity=gini maxDepth=10 maxBins=100\n",
      " ==>所需时间=2.10627102852 结果AUC = 0.632781339557\n",
      "训练评估：使用参数 impurity=gini maxDepth=10 maxBins=200\n",
      " ==>所需时间=2.07273602486 结果AUC = 0.652975152894\n",
      "训练评估：使用参数 impurity=gini maxDepth=15 maxBins=3\n",
      " ==>所需时间=2.55352687836 结果AUC = 0.597807782078\n",
      "训练评估：使用参数 impurity=gini maxDepth=15 maxBins=5\n",
      " ==>所需时间=2.32855892181 结果AUC = 0.603731497622\n",
      "训练评估：使用参数 impurity=gini maxDepth=15 maxBins=10\n",
      " ==>所需时间=2.22553801537 结果AUC = 0.621199810914\n",
      "训练评估：使用参数 impurity=gini maxDepth=15 maxBins=50\n",
      " ==>所需时间=2.74634003639 结果AUC = 0.620978225544\n",
      "训练评估：使用参数 impurity=gini maxDepth=15 maxBins=100\n",
      " ==>所需时间=2.70136404037 结果AUC = 0.630558099684\n",
      "训练评估：使用参数 impurity=gini maxDepth=15 maxBins=200\n",
      " ==>所需时间=3.22185015678 结果AUC = 0.625343457323\n",
      "训练评估：使用参数 impurity=gini maxDepth=20 maxBins=3\n",
      " ==>所需时间=2.73227310181 结果AUC = 0.588626761604\n",
      "训练评估：使用参数 impurity=gini maxDepth=20 maxBins=5\n",
      " ==>所需时间=2.7249109745 结果AUC = 0.592814725086\n",
      "训练评估：使用参数 impurity=gini maxDepth=20 maxBins=10\n",
      " ==>所需时间=2.7599670887 结果AUC = 0.617233432801\n",
      "训练评估：使用参数 impurity=gini maxDepth=20 maxBins=50\n",
      " ==>所需时间=2.85403895378 结果AUC = 0.595754424321\n",
      "训练评估：使用参数 impurity=gini maxDepth=20 maxBins=100\n",
      " ==>所需时间=3.24065613747 结果AUC = 0.629221201288\n",
      "训练评估：使用参数 impurity=gini maxDepth=20 maxBins=200\n",
      " ==>所需时间=3.51528286934 结果AUC = 0.623962241853\n",
      "训练评估：使用参数 impurity=gini maxDepth=25 maxBins=3\n",
      " ==>所需时间=3.27625989914 结果AUC = 0.581720684256\n",
      "训练评估：使用参数 impurity=gini maxDepth=25 maxBins=5\n",
      " ==>所需时间=3.5571269989 结果AUC = 0.594151623482\n",
      "训练评估：使用参数 impurity=gini maxDepth=25 maxBins=10\n",
      " ==>所需时间=3.04372286797 结果AUC = 0.61433805064\n",
      "训练评估：使用参数 impurity=gini maxDepth=25 maxBins=50\n",
      " ==>所需时间=3.55375385284 结果AUC = 0.595665790173\n",
      "训练评估：使用参数 impurity=gini maxDepth=25 maxBins=100\n",
      " ==>所需时间=3.43916296959 结果AUC = 0.623652022336\n",
      "训练评估：使用参数 impurity=gini maxDepth=25 maxBins=200\n",
      " ==>所需时间=4.63883781433 结果AUC = 0.618393062901\n",
      "训练评估：使用参数 impurity=entropy maxDepth=3 maxBins=3\n",
      " ==>所需时间=1.28930902481 结果AUC = 0.602697432564\n",
      "训练评估：使用参数 impurity=entropy maxDepth=3 maxBins=5\n",
      " ==>所需时间=1.15614795685 结果AUC = 0.599344107306\n",
      "训练评估：使用参数 impurity=entropy maxDepth=3 maxBins=10\n",
      " ==>所需时间=1.1184990406 结果AUC = 0.610179631873\n",
      "训练评估：使用参数 impurity=entropy maxDepth=3 maxBins=50\n",
      " ==>所需时间=1.12241601944 结果AUC = 0.610179631873\n",
      "训练评估：使用参数 impurity=entropy maxDepth=3 maxBins=100\n",
      " ==>所需时间=1.06939697266 结果AUC = 0.607099595237\n",
      "训练评估：使用参数 impurity=entropy maxDepth=3 maxBins=200\n",
      " ==>所需时间=1.17944788933 结果AUC = 0.607099595237\n",
      "训练评估：使用参数 impurity=entropy maxDepth=5 maxBins=3\n",
      " ==>所需时间=1.17291498184 结果AUC = 0.607638786303\n",
      "训练评估：使用参数 impurity=entropy maxDepth=5 maxBins=5\n",
      " ==>所需时间=1.20831990242 结果AUC = 0.647716193459\n",
      "训练评估：使用参数 impurity=entropy maxDepth=5 maxBins=10\n",
      " ==>所需时间=1.19011211395 结果AUC = 0.611427896121\n",
      "训练评估：使用参数 impurity=entropy maxDepth=5 maxBins=50\n",
      " ==>所需时间=1.19930911064 结果AUC = 0.617802168582\n",
      "训练评估：使用参数 impurity=entropy maxDepth=5 maxBins=100\n",
      " ==>所需时间=1.27470612526 结果AUC = 0.632559754188\n",
      "训练评估：使用参数 impurity=entropy maxDepth=5 maxBins=200\n",
      " ==>所需时间=1.33996200562 结果AUC = 0.630196176914\n",
      "训练评估：使用参数 impurity=entropy maxDepth=10 maxBins=3\n",
      " ==>所需时间=1.60161519051 结果AUC = 0.620350400331\n",
      "训练评估：使用参数 impurity=entropy maxDepth=10 maxBins=5\n",
      " ==>所需时间=1.77134585381 结果AUC = 0.617366384022\n",
      "训练评估：使用参数 impurity=entropy maxDepth=10 maxBins=10\n",
      " ==>所需时间=1.75202298164 结果AUC = 0.651017815464\n",
      "训练评估：使用参数 impurity=entropy maxDepth=10 maxBins=50\n",
      " ==>所需时间=1.63921093941 结果AUC = 0.643794132419\n",
      "训练评估：使用参数 impurity=entropy maxDepth=10 maxBins=100\n",
      " ==>所需时间=1.77200984955 结果AUC = 0.664822583981\n",
      "训练评估：使用参数 impurity=entropy maxDepth=10 maxBins=200\n",
      " ==>所需时间=2.02798604965 结果AUC = 0.649717847963\n",
      "训练评估：使用参数 impurity=entropy maxDepth=15 maxBins=3\n",
      " ==>所需时间=2.01987290382 结果AUC = 0.594823765769\n",
      "训练评估：使用参数 impurity=entropy maxDepth=15 maxBins=5\n",
      " ==>所需时间=2.23783898354 结果AUC = 0.602394599226\n",
      "训练评估：使用参数 impurity=entropy maxDepth=15 maxBins=10\n",
      " ==>所需时间=2.15511393547 结果AUC = 0.619818595444\n",
      "训练评估：使用参数 impurity=entropy maxDepth=15 maxBins=50\n",
      " ==>所需时间=2.26465392113 结果AUC = 0.620668006027\n",
      "训练评估：使用参数 impurity=entropy maxDepth=15 maxBins=100\n",
      " ==>所需时间=2.64654302597 结果AUC = 0.645973055219\n",
      "训练评估：使用参数 impurity=entropy maxDepth=15 maxBins=200\n",
      " ==>所需时间=3.27653098106 结果AUC = 0.640581144562\n",
      "训练评估：使用参数 impurity=entropy maxDepth=20 maxBins=3\n",
      " ==>所需时间=2.52568507195 结果AUC = 0.583013265577\n",
      "训练评估：使用参数 impurity=entropy maxDepth=20 maxBins=5\n",
      " ==>所需时间=2.93766403198 结果AUC = 0.607254704996\n",
      "训练评估：使用参数 impurity=entropy maxDepth=20 maxBins=10\n",
      " ==>所需时间=3.17559123039 结果AUC = 0.623962241853\n",
      "训练评估：使用参数 impurity=entropy maxDepth=20 maxBins=50\n",
      " ==>所需时间=3.37932801247 结果AUC = 0.604492274057\n",
      "训练评估：使用参数 impurity=entropy maxDepth=20 maxBins=100\n",
      " ==>所需时间=3.29255199432 结果AUC = 0.663530002659\n",
      "训练评估：使用参数 impurity=entropy maxDepth=20 maxBins=200\n",
      " ==>所需时间=4.39839911461 结果AUC = 0.641386238071\n",
      "训练评估：使用参数 impurity=entropy maxDepth=25 maxBins=3\n",
      " ==>所需时间=3.15931296349 结果AUC = 0.566394362868\n",
      "训练评估：使用参数 impurity=entropy maxDepth=25 maxBins=5\n",
      " ==>所需时间=3.01386809349 结果AUC = 0.612735249801\n",
      "训练评估：使用参数 impurity=entropy maxDepth=25 maxBins=10\n",
      " ==>所需时间=4.09433102608 结果AUC = 0.625299140249\n",
      "训练评估：使用参数 impurity=entropy maxDepth=25 maxBins=50\n",
      " ==>所需时间=3.16140985489 结果AUC = 0.608502969244\n",
      "训练评估：使用参数 impurity=entropy maxDepth=25 maxBins=100\n",
      " ==>所需时间=3.44188809395 结果AUC = 0.647398587763\n",
      "训练评估：使用参数 impurity=entropy maxDepth=25 maxBins=200\n",
      " ==>所需时间=4.03295302391 结果AUC = 0.641430555145\n",
      "调校后最佳参数：impurity:entropy,maxDepth:10,maxBins:100\n",
      ",    结果AUC = 0.664822583981\n"
     ]
    }
   ],
   "source": [
    "    print(\"-----所有参数训练评估找出最好的参数组合---------\")  \n",
    "    bestModel=evalAllParameter(trainData, validationData,\n",
    "                          [\"gini\", \"entropy\"],\n",
    "                          [3, 5, 10, 15, 20, 25], \n",
    "                          [3, 5, 10, 50, 100, 200 ])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "# 13.12 如何确认是否Overfitting（过度训练）？"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "AUC=0.670959944751\n"
     ]
    }
   ],
   "source": [
    "AUC=evaluateModel(model, testData)\n",
    "print \"AUC=\"+str(AUC)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 2",
   "language": "python",
   "name": "python2"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.11"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0
}
